/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年9月30日
 * 项目： rainhy-auth
 */
package com.rainhy.auth.authItemManager.springdata.entity;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;

import org.hibernate.annotations.GenericGenerator;
import org.joda.time.DateTime;
import org.springframework.data.domain.Persistable;

import com.rainhy.auth.context.AuthItem;
import com.rainhy.auth.context.AuthItemRef;

/**
 * 权限引用实体<br>
 * authItemKey,authRefId,authRefType 联合唯一建
 * 
 * @author rain
 * @version [版本号, 2016年9月30日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
@Entity
@Table(name = "core_auth_authitem_ref", uniqueConstraints = @UniqueConstraint(columnNames = { "authItemKey", "authRefId", "authRefType" }))
public class AuthItemRefEntity implements AuthItemRef, Persistable<String> {
    private static final long serialVersionUID = 2224417683079171008L;
    
    /** 主键 */
    @Id
    @GeneratedValue(generator = "paymentableGenerator")
    @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
    @Column(length = 32)
    private String id;
    
    /** 创建者 */
    @Column(length = 32)
    private String createdBy;
    
    /** 创建时间 */
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;
    
    /** 最后修改者 */
    @Column(length = 32)
    private String lastModifiedBy;
    
    /** 最后修改时间 */
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;
    
    /** authItem实例 */
    @Transient
    private AuthItem authItem;
    
    /** 权限 key */
    @Column(length = 256, nullable = false)
    private String authItemKey;
    
    /** 根据引用类型而变动(可以是用户的id,code. 或者职位的id,code. 等任何标识型东西) */
    @Column(length = 64)
    private String authRefId;
    
    /**
     * 权限引用项的类型<br>
     * 利用该类型<br>
     * 实现 人员权限 AUTHREFTYPE_OPERATOR <br>
     * 临时权限 AUTHREFTYPE_OPERATOR_TEMP <br>
     * 角色权限 AUTHREFTYPE_ROLE <br>
     * 职位权限 ... ... <br>
     * 这里用String虽没有int查询快，但能让sql可读性增强
     */
    @Column(length = 64)
    private String authRefType;
    
    /** 权限引用项生效时间,如果为 null 则没有生效时间(立即生效) */
    @Temporal(TemporalType.TIMESTAMP)
    private Date effectiveDate;
    
    /** 权限引用项无效时间,如果为 null 则没有无效时间(永久有效) */
    @Temporal(TemporalType.TIMESTAMP)
    private Date invalidDate;
    
    public AuthItemRefEntity() {
        this((String) null);
    }
    
    /** 创建一个可持久化实体 */
    public AuthItemRefEntity(String id) {
        this.setId(id);
    }
    
    @Override
    public AuthItem getAuthItem() {
        return this.authItem;
    }
    
    /** 权限 key */
    public String getAuthItemKey() {
        return authItemKey;
    }
    
    @Override
    public String getAuthRefId() {
        return this.authRefId;
    }
    
    @Override
    public String getAuthRefType() {
        return this.authRefType;
    }
    
    /** 创建者 */
    public String getCreatedBy() {
        return createdBy;
    }
    
    /** 创建时间 */
    public DateTime getCreatedDate() {
        return null == createdDate ? null : new DateTime(createdDate);
    }
    
    @Override
    public DateTime getEffectiveDate() {
        return this.effectiveDate == null ? null : new DateTime(this.effectiveDate);
    }
    
    /** 主键 */
    @Override
    public String getId() {
        return id;
    }
    
    /** 权限引用项无效时间,如果为 null 则没有无效时间(永久有效) */
    @Override
    public DateTime getInvalidDate() {
        return this.invalidDate == null ? null : new DateTime(this.invalidDate);
    }
    
    /** 最后修改者 */
    public String getLastModifiedBy() {
        return lastModifiedBy;
    }
    
    /** 最后修改时间 */
    public DateTime getLastModifiedDate() {
        return null == lastModifiedDate ? null : new DateTime(lastModifiedDate);
    }
    
    @Override
    @Transient
    public boolean isNew() {
        return null == getId();
    }
    
    /** authItem实例 */
    public void setAuthItem(final AuthItem authItem) {
        this.authItem = authItem;
    }
    
    /** 权限 key */
    public void setAuthItemKey(final String authItemKey) {
        this.authItemKey = authItemKey;
    }
    
    /** 根据引用类型而变动(可以是用户的id,code. 或者职位的id,code. 等任何标识型东西) */
    public void setAuthRefId(final String authRefId) {
        this.authRefId = authRefId;
    }
    
    /**
     * 权限引用项的类型<br>
     * 利用该类型<br>
     * 实现 人员权限 AUTHREFTYPE_OPERATOR <br>
     * 临时权限 AUTHREFTYPE_OPERATOR_TEMP <br>
     * 角色权限 AUTHREFTYPE_ROLE <br>
     * 职位权限 ... ... <br>
     * 这里用String虽没有int查询快，但能让sql可读性增强
     */
    public void setAuthRefType(final String authRefType) {
        this.authRefType = authRefType;
    }
    
    /** 创建者 */
    public void setCreatedBy(final String createdBy) {
        this.createdBy = createdBy;
    }
    
    /** 创建时间 */
    public void setCreatedDate(final DateTime createdDate) {
        this.createdDate = null == createdDate ? null : createdDate.toDate();
    }
    
    /** 权限引用项生效时间,如果为 null 则没有生效时间(立即生效) */
    public void setEffectiveDate(final DateTime effectiveDate) {
        this.effectiveDate = effectiveDate == null ? null : effectiveDate.toDate();
    }
    
    /** 权限引用项无效时间,如果为 null 则没有无效时间(永久有效) */
    public void setInvalidDate(final DateTime invalidDate) {
        this.invalidDate = invalidDate == null ? null : invalidDate.toDate();
    }
    
    /** 最后修改者 */
    public void setLastModifiedBy(final String lastModifiedBy) {
        this.lastModifiedBy = lastModifiedBy;
    }
    
    /** 最后修改时间 */
    public void setLastModifiedDate(final DateTime lastModifiedDate) {
        this.lastModifiedDate = null == lastModifiedDate ? null : lastModifiedDate.toDate();
    }
    
    @Override
    public String toString() {
        return String.format("Entity of type %s with id: %s", this.getClass().getName(), getId());
    }
    
    /** 主键 */
    protected void setId(final String id) {
        this.id = id;
    }
}
